; library math include file
;
;**************************************************************************************
;* COCO3()
;**************************************************************************************
FUNCTION	COCO3	
REM	;COCO3()  returns value of 1 to b register
REM	;
COCO3	LDD	$FFFE	;check if coco3
	ADDD	$FFFF
	CMPA	#167
	BEQ	SETUPCC3
	CLRB
	RTS
SETUPCC3	LDB	#1
	RTS
ENDFUNCTION
;
; **********************************************************************************************************************
; * create sin_cos table
; **********************************************************************************************************************
FUNCTION	MAKESINCOS	
REM	; makesincos() creates and returns sine table to x register 
REM	; This table is needed for rotational graphics such as circle
#NOMOVE
SINTBL	FCB	128,131,134,137,140,143,146,149,152,155,158,162,165,167,170,173	; 16
	FCB	176,179,182,185,188,190,193,196,198,201,203,206,208,211,213,215	; 32
	FCB	218,220,222,224,226,228,230,232,233,235,237,238,240,241,243,244	; 48
	FCB	245,246,247,248,249,250,251,252,252,253,253,254,254,254,254,255	; 64
COSTBL	FCB	255,254,254,254,254,253,253,252,252,251,250,250,249,248,247,246	; 80
	FCB	244,243,242,240,239,237,236,234,232,231,229,227,225,223,221,219	; 96
	FCB	216,214,212,210,207,205,202,200,197,194,192,189,186,183,181,178	; 112
	FCB	175,172,169,166,163,160,157,154,151,148,145,142,138,135,132,129	; 128
	FCB	126,124,121,118,114,111,108,105,102,99,96,93,90,87,84,81	; 144
	FCB	78,75,73,70,67,64,62,59,56,54,51,49,46,44,42,40	; 160
	FCB	37,35,33,31,29,27,25,24,22,20,19,17,16,14,13,12	; 176
	FCB	10,9,8,7,6,5,4,3,3,2,2,1,1,1,1,0	; 192
	FCB	0,1,1,1,1,2,2,3,4,5,6,7,8,9,10,11	; 208
	FCB	12,13,15,16,18,19,21,23,24,26,28,30,32,34,36,38	; 224
	FCB	41,43,45,48,50,53,55,58,60,63,66,68,71,74,77,80	; 240
	FCB	83,86,89,91,94,98,101,104,107,110,113,116,119,122,125,128	; 256
#MOVE
MAKESINCOS	LDX	#SINTBL
	RTS
ENDFUNCTION
;
; **********************************************************************************************************************
; * create sin_cos table 3d perspective
; **********************************************************************************************************************
FUNCTION	MAKESINCOS3D	
REM	; makesincos3d() creates and returns sine table to x register and cosine to y register
REM	; This table is needed for rotational graphics such as circle
#NOMOVE
SINTBL	FCB	128,130,132,135,137,139,142,144,147,149,151,154,156,158,161,163	;16
	FCB	165,168,170,172,175,177,179,181,184,186,188,190,192,195,197,199	;32
	FCB	201,203,205,207,209,211,213,215,217,218,220,222,224,225,227,229	;48
	FCB	230,232,233,235,236,238,239,240,241,243,244,245,246,247,248,248	;64
	FCB	249,250,250,251,251,252,252,252,253,253,253,253,253,252,252,252	;80
	FCB	251,251,250,249,249,248,247,246,244,243,242,240,239,237,235,233	;96
	FCB	231,229,227,225,223,220,218,215,212,209,206,204,200,197,194,191	;112
	FCB	188,184,181,177,174,170,166,162,159,155,151,147,143,139,135,131	;128
	FCB	127,124,120,116,112,108,104,100,96,93,89,85,81,78,74,71	;144
	FCB	67,64,61,58,55,51,49,46,43,40,37,35,32,30,28,26	;160
	FCB	24,22,20,18,16,15,13,12,11,9,8,7,6,6,5,4	;176
	FCB	4,3,3,3,2,2,2,2,2,3,3,3,4,4,5,5	;192
	FCB	6,7,7,8,9,10,11,12,14,15,16,17,19,20,22,23	;208
	FCB	25,26,28,30,31,33,35,37,38,40,42,44,46,48,50,52	;224
	FCB	54,56,58,60,63,65,67,69,71,74,76,78,80,83,85,87	;240
	FCB	90,92,94,97,99,101,104,106,108,111,113,116,118,120,123,125	;256
	FCB	128,130,132,135,137,139,142,144,147,149,151,154,156,158,161,163	;16
	FCB	165,168,170,172,175,177,179,181,184,186,188,190,192,195,197,199	;32
	FCB	201,203,205,207,209,211,213,215,217,218,220,222,224,225,227,229	;48
	FCB	230,232,233,235,236,238,239,240,241,243,244,245,246,247,248,248	;64
	FCB	249,250,250,251,251,252,252,252,253,253,253,253,253,252,252,252	;80
	FCB	251,251,250,249,249,248,247,246,244,243,242,240,239,237,235,233	;96
	FCB	231,229,227,225,223,220,218,215,212,209,206,204,200,197,194,191	;112
	FCB	188,184,181,177,174,170,166,162,159,155,151,147,143,139,135,131	;128
	FCB	127,124,120,116,112,108,104,100,96,93,89,85,81,78,74,71	;144
	FCB	67,64,61,58,55,51,49,46,43,40,37,35,32,30,28,26	;160
	FCB	24,22,20,18,16,15,13,12,11,9,8,7,6,6,5,4	;176
	FCB	4,3,3,3,2,2,2,2,2,3,3,3,4,4,5,5	;192
	FCB	6,7,7,8,9,10,11,12,14,15,16,17,19,20,22,23	;208
	FCB	25,26,28,30,31,33,35,37,38,40,42,44,46,48,50,52	;224
	FCB	54,56,58,60,63,65,67,69,71,74,76,78,80,83,85,87	;240
	FCB	90,92,94,97,99,101,104,106,108,111,113,116,118,120,123,125	;256
	FCB	128,130,132,135,137,139,142,144,147,149,151,154,156,158,161,163	;16
	FCB	165,168,170,172,175,177,179,181,184,186,188,190,192,195,197,199	;32
	FCB	201,203,205,207,209,211,213,215,217,218,220,222,224,225,227,229	;48
	FCB	230,232,233,235,236,238,239,240,241,243,244,245,246,247,248,248	;64
	FCB	0
COSTBL	FCB	85,85,85,86,86,86,86,86,86,86,86,86,87,87,87,87	;16
	FCB	87,88,88,88,89,89,89,90,90,90,91,91,92,92,93,93	;32
	FCB	94,94,95,95,96,96,97,98,98,99,100,100,101,102,102,103	;48
	FCB	104,105,105,106,107,108,109,110,111,111,112,113,114,115,116,117	;64
	FCB	118,119,120,121,122,123,124,125,126,127,129,130,131,132,133,134	;80
	FCB	135,136,137,139,140,141,142,143,144,145,146,147,148,150,151,152	;96
	FCB	153,154,155,156,157,158,159,159,160,161,162,163,164,164,165,166	;112
	FCB	166,167,168,168,169,169,170,170,170,171,171,171,171,171,172,172	;128
	FCB	172,172,172,171,171,171,171,171,170,170,170,169,169,168,168,167	;144
	FCB	166,166,165,164,164,163,162,161,160,159,159,158,157,156,155,154	;160
	FCB	153,152,151,150,148,147,146,145,144,143,142,141,140,139,137,136	;176
	FCB	135,134,133,132,131,130,129,127,126,125,124,123,122,121,120,119	;192
	FCB	118,117,116,115,114,113,112,111,111,110,109,108,107,106,105,105	;208
	FCB	104,103,102,102,101,100,100,99,98,98,97,96,96,95,95,94	;224
	FCB	94,93,93,92,92,91,91,90,90,90,89,89,89,88,88,88	;240
	FCB	87,87,87,87,87,86,86,86,86,86,86,86,86,86,85,85	;256
	FCB	85,85,85,86,86,86,86,86,86,86,86,86,87,87,87,87	;16
	FCB	87,88,88,88,89,89,89,90,90,90,91,91,92,92,93,93	;32
	FCB	94,94,95,95,96,96,97,98,98,99,100,100,101,102,102,103	;48
	FCB	104,105,105,106,107,108,109,110,111,111,112,113,114,115,116,117	;64
	FCB	118,119,120,121,122,123,124,125,126,127,129,130,131,132,133,134	;80
	FCB	135,136,137,139,140,141,142,143,144,145,146,147,148,150,151,152	;96
	FCB	153,154,155,156,157,158,159,159,160,161,162,163,164,164,165,166	;112
	FCB	166,167,168,168,169,169,170,170,170,171,171,171,171,171,172,172	;128
	FCB	172,172,172,171,171,171,171,171,170,170,170,169,169,168,168,167	;144
	FCB	166,166,165,164,164,163,162,161,160,159,159,158,157,156,155,154	;160
	FCB	153,152,151,150,148,147,146,145,144,143,142,141,140,139,137,136	;176
	FCB	135,134,133,132,131,130,129,127,126,125,124,123,122,121,120,119	;192
	FCB	118,117,116,115,114,113,112,111,111,110,109,108,107,106,105,105	;208
	FCB	104,103,102,102,101,100,100,99,98,98,97,96,96,95,95,94	;224
	FCB	94,93,93,92,92,91,91,90,90,90,89,89,89,88,88,88	;240
	FCB	87,87,87,87,87,86,86,86,86,86,86,86,86,86,85,85	;256
	FCB	85,85,85,86,86,86,86,86,86,86,86,86,87,87,87,87	;16
	FCB	87,88,88,88,89,89,89,90,90,90,91,91,92,92,93,93	;32
	FCB	94,94,95,95,96,96,97,98,98,99,100,100,101,102,102,103	;48
	FCB	104,105,105,106,107,108,109,110,111,111,112,113,114,115,116,117	;64
	FCB	0
#MOVE
MAKESINCOS3D	LDY	#COSTBL
	LDX	#SINTBL
	RTS
ENDFUNCTION
;
;
; *******************************************************************************************************************
; * tanangle(x,y)
; *******************************************************************************************************************
FUNCTION	TANANGLE	XP,YP
REM	; tanangle(x,y) returns angle from values -4 to 4 on both axis. (use signed bytes)
REM	; returns angle to b register
DEF	XP	BYTE
DEF	YP	BYTE
XP	FCB	0
YP	FCB	0
SX	FCB	4
SY	FCB	4
JOYTAN	FCB	160,154,147,139,128,117,109,102,096	;0
	FCB	166,160,152,141,128,115,104,096,090	;1
	FCB	173,168,000,000,000,000,000,088,083	;2
	FCB	182,179,000,000,000,000,000,077,074	;3
	FCB	192,192,000,000,000,000,000,064,064	;4
	FCB	202,205,000,000,000,000,000,051,054	;5
	FCB	211,216,000,000,000,000,000,040,045	;6
	FCB	218,224,232,243,255,013,024,032,038	;7
	FCB	224,230,237,246,255,010,019,026,032	;8
TANANGLE	LDA	#4
	STA	SX
	STA	SY
	LDA	XP
	CMPA	#128
	BLS	NOTNEGX
; its negativex
	SUBA	#128
	STA	XP
	LDA	SX
	SUBA	XP
	STA	SX
	BRA	CHECKY
NOTNEGX	LDA	SX
	ADDA	XP
	STA	SX
CHECKY	LDA	YP
	CMPA	#128
	BLS	NOTNEGY
; its negativex
	SUBA	#128
	STA	YP
	LDA	SY
	SUBA	YP
	STA	SY
	BRA	CHECKD
NOTNEGY	LDA	SY
	ADDA	YP
	STA	SY
CHECKD	LDA	SX
	CMPA	#9
	BHS	EXIT1
	LDA	SY
	CMPA	#9
	BHS	EXIT1
; calc it
	LDX	#JOYTAN
	LDA	#9
	LDB	SY
	MUL
	LEAX	B,X
	LDA	SX
	LDB	A,X
	RTS
EXIT1	CLRB
	RTS	;no go out of range
ENDFUNCTION
;
;
; *******************************************************************************************************************
; * tanjoystick2()
; *******************************************************************************************************************
FUNCTION	TANJOYSTICK2
REM	; tanjoystick2() returns angle from joystick
REM	; returns angle to b register
XP	FCB	0
YP	FCB	0
SX	FCB	4
SY	FCB	4
JOYTAN	FCB	160,154,147,139,128,117,109,102,096	;0
	FCB	166,160,152,141,128,115,104,096,090	;1
	FCB	173,168,000,000,000,000,000,088,083	;2
	FCB	182,179,000,000,000,000,000,077,074	;3
	FCB	192,192,000,000,000,000,000,064,064	;4
	FCB	202,205,000,000,000,000,000,051,054	;5
	FCB	211,216,000,000,000,000,000,040,045	;6
	FCB	218,224,232,243,255,013,024,032,038	;7
	FCB	224,230,237,246,255,010,019,026,032	;8
	FCB	224,230,237,246,255,010,019,026,032	;8
; data 0-64
; data 0-32
; data 0-16
; data 0-8
TANJOYSTICK2	LDA	$015A
	LSRA
	LSRA
	LSRA
	STA	SY
	LDA	$015B
	LSRA
	LSRA
	LSRA
	STA	SX
	LDX	#JOYTAN
	LDA	#9
	LDB	SY
	MUL
	LEAX	d,X
	LDA	SX
	LDB	A,X
	RTS
ENDFUNCTION
;
;
; *******************************************************************************************************************
; * tanjoystick()
; *******************************************************************************************************************
FUNCTION	TANJOYSTICK	
REM	; tanjoystick() returns angle from joystick
REM	; returns angle to b register
XP	FCB	0
YP	FCB	0
SX	FCB	0
SY	FCB	0
JOYTAN	FCB	160,159,158,156,154,153,151,149,147,145,143,141,139,136,134,131,128,125,122,120,117,115,113,111,109,107,105,103,102,100,98,97,96	;
	FCB	161,160,159,157,156,154,152,150,149,146,144,141,139,136,134,131,128,125,122,119,117,115,112,110,107,106,104,102,100,99,97,96,95	;
	FCB	163,161,160,158,157,156,153,151,149,147,145,142,139,137,134,132,128,124,122,119,117,114,111,109,107,105,102,100,99,98,96,95,93	;
	FCB	164,163,162,160,158,157,155,153,151,149,146,144,141,137,134,132,128,124,122,119,115,112,110,107,105,103,101,99,98,96,94,93,92	;
	FCB	166,165,163,162,160,158,156,154,152,150,147,144,141,139,135,132,128,124,121,117,115,112,109,106,104,102,100,98,96,94,93,91,90	;
	FCB	168,166,165,163,162,160,158,156,154,151,149,146,142,139,136,132,128,124,120,117,114,110,107,105,102,100,98,96,94,93,91,90,88	;
	FCB	169,168,167,166,164,162,160,158,156,153,150,147,144,140,136,132,128,124,119,116,112,109,106,103,100,98,96,94,92,90,89,88,87	;
	FCB	171,170,169,168,166,164,163,160,158,155,152,149,145,141,137,133,128,123,119,115,111,107,104,101,98,96,93,92,90,88,87,85,85	;
	FCB	173,172,171,170,168,166,165,163,160,158,154,151,147,143,139,134,128,122,117,113,109,105,102,98,96,93,91,90,88,86,85,84,83	;
	FCB	175,174,173,172,170,169,168,166,163,160,157,153,149,145,139,134,128,122,117,111,107,102,99,96,93,90,88,87,85,84,83,82,81	;
	FCB	178,177,175,175,173,172,170,168,166,163,160,156,152,147,141,135,128,121,115,109,104,100,96,93,90,88,85,84,83,81,81,79,78	;
	FCB	180,179,178,177,176,175,173,171,169,167,164,160,156,150,144,136,128,119,112,106,100,96,92,89,87,85,83,81,80,79,78,77,76	;
	FCB	182,182,181,180,179,178,177,175,173,171,168,165,160,154,147,139,128,117,109,102,96,91,88,85,83,81,79,78,77,76,75,74,74	;
	FCB	185,184,183,183,182,181,180,179,178,175,173,170,166,0,0,0,0,0,0,0,90,85,83,81,78,77,76,75,74,73,73,72,71	;
	FCB	187,187,186,186,185,185,184,183,182,181,179,177,173,0,0,0,0,0,0,0,83,79,77,75,74,73,72,71,71,70,70,69,69	;
	FCB	190,190,189,189,189,188,188,187,187,186,185,184,182,0,0,0,0,0,0,0,74,72,71,70,69,68,68,68,67,67,67,66,66	;
	FCB	192,192,192,192,192,192,192,192,192,192,192,192,192,0,0,0,0,0,0,0,64,64,64,64,64,64,64,64,64,64,64,64,64	;
	FCB	195,195,195,195,195,196,196,197,197,198,199,200,202,0,0,0,0,0,0,0,54,56,57,58,59,59,60,60,61,61,61,61,61	;
	FCB	197,197,198,198,199,200,200,201,202,203,205,207,211,0,0,0,0,0,0,0,45,49,51,53,54,55,56,56,57,58,58,59,59	;
	FCB	200,200,201,201,202,203,204,205,207,209,211,214,218,0,0,0,0,0,0,0,38,42,45,47,49,51,52,53,54,55,55,56,56	;
	FCB	202,202,203,204,205,206,207,209,211,213,216,219,224,230,237,246,255,10,19,26,32,37,40,43,45,47,49,50,51,51,53,54,54	;
	FCB	204,205,206,207,208,209,211,213,215,217,220,224,229,234,241,248,255,8,15,22,27,32,36,39,41,43,45,47,48,49,50,51,51	;
	FCB	207,207,209,209,211,212,214,216,218,221,224,228,232,237,243,249,255,7,13,19,24,28,32,35,38,40,42,44,45,47,47,49,49	;
	FCB	209,210,211,212,214,215,217,219,221,224,227,231,235,239,245,250,255,6,11,17,21,25,29,32,34,37,39,41,42,44,45,46,47	;
	FCB	211,212,213,214,216,218,219,221,224,226,230,233,237,241,246,251,255,5,10,15,19,23,26,30,32,34,37,38,40,42,43,44,45	;
	FCB	213,214,215,217,218,220,221,224,226,229,232,235,239,243,247,251,255,5,9,13,17,21,24,27,30,32,34,36,38,39,41,42,43	;
	FCB	215,216,217,219,220,222,224,226,229,231,234,237,241,244,248,252,255,4,8,12,15,19,22,25,27,30,32,34,36,37,39,40,41	;
	FCB	217,218,219,221,222,224,226,228,230,233,236,238,242,245,248,252,255,4,8,11,14,17,20,23,26,28,30,32,34,35,37,38,39	;
	FCB	218,219,221,222,224,226,228,230,232,234,237,240,243,246,249,253,255,3,7,10,13,16,19,22,24,26,28,30,32,34,35,37,38	;
	FCB	220,221,222,224,226,227,229,231,234,236,238,241,243,247,250,253,255,3,6,9,13,15,17,20,22,25,27,29,30,32,34,35,36	;
	FCB	221,223,224,226,227,229,231,233,235,237,239,242,245,247,250,253,255,3,6,9,11,14,17,19,21,23,25,27,29,30,32,33,34	;
	FCB	223,224,225,227,229,230,232,234,236,238,241,243,246,248,251,253,255,3,5,8,10,13,15,18,20,22,24,26,27,29,31,32,33	;
	FCB	224,225,226,228,230,231,233,235,237,239,241,243,246,248,251,253,255,3,5,8,10,13,15,17,19,21,23,25,26,28,30,31,32	;
; data 0-64
; data 0-32
; data 0-16
; data 0-8
TANJOYSTICK	LDA	$015A
	LSRA
	STA	SY
	LDA	$015B
	LSRA
	STA	SX
CHECKD	CMPA	#33
	BHS	EXIT1
	LDA	SY
	CMPA	#33
	BHS	EXIT1
; calc it
	LDX	#JOYTAN
	LDA	#33
	LDB	SY
	MUL
	LEAX	D,X
	LDA	SX
	LDB	A,X
	RTS
EXIT1	CLRB
	RTS	;no go out of range
ENDFUNCTION
;
;
; ***********************************************************************************************************************
; * rnd(x,y)
; * returns value to a register
; ***********************************************************************************************************************
FUNCTION	RND	LOWV,HIGHV
REM	; rnd(low range, high range) value is from range 0-254 and low cannot be higher then high range
REM	; Returns result to b register
DEF	LOWV	BYTE
DEF	HIGHV	BYTE
RNDR	FCB	0
LOWV	FCB	0
HIGHV	FCB	0
STEPR	FCB	0
RES	FCB	0
SUBT	FCB	0
RND	LDB	HIGHV
	INCB
	STB	HIGHV
	SUBB	LOWV
	STB	RNDR
	DEC	HIGHV
;rnd
RND15	LDB	$113
	ADDB	STEPR
	STB	RES
;now i should have 0-15 in the bit bucket
;wrap it
;	LSLB
	STB	STEPR
RNDL15	CMPB	RNDR
	BLS	RNDR15
	SUBB	RNDR
	BRA	RNDL15
RNDR15	ADDB	LOWV
RNX15	CMPB	HIGHV
	BLS	RNY15
	INC	STEPR
	LDB	LOWV
RNY15	STB	RES
	RTS
ENDFUNCTION
;
;**************************************************************************************
;* inkey$
;**************************************************************************************
FUNCTION	INKEY$	
REM	;inkey$()  returns keypress value into A register...  =0 if nothing pressed
REM	;Does not push to stack and assume it uses A,B,X,Y,U but you can test to confirm.
INKEY$	JSR	[$A000]
	RTS
ENDFUNCTION
;
; *************************************************************************************
; * str$(word address,retstring adr)
; *************************************************************************************
; convert number to string
; put numbers in for string add
; 
FUNCTION	STR$	NUMSTA,X
REM	;str$(word,[return string])  word is a value or 0-65535 and needs a return address to populate string. 6 BYTES REQUIRED
REM	;Does not push to stack and uses A,B,X,Y,U registers
DEF	X	STRING	;populate x register with string at x
DEF	NUMSTA	WORD	;save 
NUMTMP	FCB	0	;temporary a storage
NUMSTA	FCB	0	;storage of number
NUMSTB	FCB	0
NUMADR1	FCB	0,0
NUMST1	FCN	"00000"	;string 1
NUMST2	FCN	"00000"	;string 2
#NOMOVE
NUMB16	FCN	"32768"
NUMB15	FCN	"16384"
NUMB14	FCN	"08192"
NUMB13	FCN	"04096"
NUMB12	FCN	"02048"
NUMB11	FCN	"01024"
NUMB10	FCN	"00512"
NUMB09	FCN	"00256"
NUMB08	FCN	"00128"
NUMB07	FCN	"00064"
NUMB06	FCN	"00032"
NUMB05	FCN	"00016"
NUMB04	FCN	"00008"
NUMB03	FCN	"00004"
NUMB02	FCN	"00002"
NUMB01	FCN	"00001"
NUMB00	FCN	"00000"
#MOVE
STR$	STX	NUMADR1	;may need to fix
	LDD	NUMSTA	;fixed i hope
	CMPD	#0
	LBEQ	WRIST0
	LDY	#NUMST2
	LDD	#$3030
	STD	,Y
	STD	2,Y
	STD	3,Y	;cleared storage with 0*S
	LDX	#NUMSTA	;first byte
	LDA	,X
	BEQ	WRIDR7	;one byte only
	BITA	#128
	BNE	STRA16
WRIDR0	BITA	#64
	BNE	STRA15
WRIDR1	BITA	#32
	BNE	STRA14	
WRIDR2	BITA	#16
	BNE	STRA13	
WRIDR3	BITA	#8
	BNE	STRA12	
WRIDR4	BITA	#4
	BNE	STRA11
WRIDR5	BITA	#2
	BNE	STRA10	
WRIDR6	BITA	#1
	BNE	STRA09
WRIDR7	LDX	#NUMSTB
	LDA	,X	;test second bit
	BITA	#128
	BNE	STRA08
WRIDR8	BITA	#64
	BNE	STRA07
WRIDR9	BITA	#32
	BNE	STRA06	
WRID10	BITA	#16
	BNE	STRA05	
WRID11	BITA	#8
	BNE	STRA04	
WRID12	BITA	#4
	BNE	STRA03
WRID13	BITA	#2
	BNE	STRA02	
WRID14	BITA	#1
	BNE	STRA01
	LBRA	STRFIX1	; done the string is now stored in numst2
STRA16	LDU	#NUMB16
	JSR	STRINGA
	BRA	WRIDR0
STRA15	LDU	#NUMB15
	JSR	STRINGA
	BRA	WRIDR1
STRA14	LDU	#NUMB14
	JSR	STRINGA
	BRA	WRIDR2
STRA13	LDU	#NUMB13
	JSR	STRINGA
	BRA	WRIDR3
STRA12	LDU	#NUMB12
	JSR	STRINGA
	BRA	WRIDR4
STRA11	LDU	#NUMB11
	JSR	STRINGA
	BRA	WRIDR5
STRA10	LDU	#NUMB10
	JSR	STRINGA
	BRA	WRIDR6
STRA09	LDU	#NUMB09
	JSR	STRINGA
	BRA	WRIDR7
STRA08	LDU	#NUMB08
	JSR	STRINGA
	BRA	WRIDR8
STRA07	LDU	#NUMB07
	JSR	STRINGA
	BRA	WRIDR9
STRA06	LDU	#NUMB06
	JSR	STRINGA
	BRA	WRID10
STRA05	LDU	#NUMB05
	JSR	STRINGA
	BRA	WRID11
STRA04	LDU	#NUMB04
	JSR	STRINGA
	BRA	WRID12
STRA03	LDU	#NUMB03
	JSR	STRINGA
	BRA	WRID13
STRA02	LDU	#NUMB02
	JSR	STRINGA
	BRA	WRID14
STRA01	LDU	#NUMB01
	JSR	STRINGA
STRFIX1	LDX	NUMADR1	;load value thats there
	LDY	#NUMST2
	LDB	#6
STRFLP0	DECB
	CMPB	#1
	BLS	STRFLP2
	LDA	,Y+
	CMPA	#48
	BEQ	STRFLP3	;get rid of extra 0*S and make spaces
	BRA	STRFLP1
STRFLP2	LDA	,Y+
STRFLP1	STA	,X+
	DECB
	CMPB	#0
	BHI	STRFLP2
	CLRA
	STA	,X
	RTS	;done sub
STRFLP3	LDA	#32	;this can be modified to kill extra space
	STA	,X+
	BRA	STRFLP0
WRIST0	LDX	NUMADR1	;load value within
	LDA	#32
	STA	,X
	STA	1,X
	STA	2,X
	STA	3,X
	LDA	#48
	STA	4,X
	CLRA
	STA	5,X
	RTS	;done 0 fix
; add two strings together 1 into 2
STRINGA	STA	NUMTMP	;store temp value and load back after done
; need to copy u to numst1
	LDY	#NUMST1
	LDB	#5
STRLP0	DECB
	LDA	B,U
	STA	B,Y
	CMPB	#0
	BHI	STRLP0
;	ok its copied so i cant fuckup the fixed string
	LDU	#NUMST1
	LDY	#NUMST2	;load string 2 index
	LDB	#5	;lets add the two strings together 5 chrs long and store answer in string 2
;start adding together
STRLP1	DECB	;main loop for math
	LDA	B,U	;set start x reference number to add to result
	ADDA	B,Y	;add u to y
	SUBA	#48	;subtract 48 ascii "0" to bring ascii back into number range
	STA	B,Y	;store answer
; //CHECK FOR CARRY
	CMPA	#58	;if the ascii=58 then the number is out of range.....this produces a carry
	BHS	STRS0
	BRA	STRS1
STRS0	SUBA	#10	;subtract 10 from the ascii code to bring it back in range
	STA	B,Y	;store remainder value
	SUBA	#48	;need to subtract 48 ascii to bring this number back in range before saving it
	CMPB	#0	;if its already 0....cant carry
	BEQ	STRS1
	DECB	;lets go to next place for the carry
	LDA	#1	;the carry
	ADDA	B,U	;add it
	STA	B,U	;store it
	INCB	;put the index back because it will decrease in the loop
STRS1	CMPB	#0
	BHI	STRLP1	
	LDA	NUMTMP
	RTS	;return from subroutine with a register restored
ENDFUNCTION
;
; ***************************************************************************************************************
; *   syncon (d)
; ***************************************************************************************************************
FUNCTION	SYNCON	DISPLAY
REM	; syncon(display) display mode 4,8 is only supported at the moment sg4 sg8 mode
REM	; Does not push to stack.  Must call sync(d,c) to copy draw screen to actual screen.
DEF	DISPLAY	BYTE
DISPLAY	FCB	0
SYNCON	LDA	DISPLAY
	CMPA	#4
	BEQ	BUFFER1
	CMPA	#8
	BEQ	BUFFER2
	RTS
;
;semigraphics 4 mode
;draw setup 1024
;start of view 1536-2048
BUFFER1	CLRA	;set value 7 so its at 3584 view
	LDX	#65478
	STA	1,X
	STA	3,X
	STA	5,X
	STA	6,X
	STA	8,X
	STA	10,X
	STA	12,X
;also setdisplaymode
	LDX	#65472
	STA	,X
	STA	2,X
	STA	4,X
;extra vgd
	CLRA
	LDX	#65314
	STA	,X	;cleared vdg
	LDX	#65436	;cc3 set
	LDA	#15	;testing
	STA	,X
	RTS
;
;semigraphics 8 mode
;3584 start of view to 5632
;5632 draw setup
BUFFER2	CLRA	;7
	LDX	#65478
	STA	1,X
	STA	3,X
	STA	5,X
	STA	6,X
	STA	8,X
	STA	10,X
	STA	12,X
;set 65314
	LDX	#65314
	LDA	,X
	ANDA	#7
	STA	,X	;set bit 7
;also setdisplaymode	;sg8
	LDX	#65472
	STA	,X
	STA	3,X
	STA	4,X
	LDX	#65436	;cc3 set
	LDA	#8	;testing
	STA	,X
; lets clear the sprite layer incase its not used
	LDX	#7680
	LDA	#128	;load the color
	LDB	#128
LP4	STD	,X++
	CMPX	#9728
	BLO	LP4
	RTS
ENDFUNCTION
;
; *********************************************************************************************************************
; * set displaymode with no buffers
; * setdisplaymode( set)
; *********************************************************************************************************************
FUNCTION	SETDISPLAYMODE	SET
REM	; setdisplaymode(display) Only two modes supported are sg4,sg8 ( 4,8 )
REM	; Does not push to stack.  Does not support sync calls (use syncon(mode) followed by sync(mode,c) )
DEF	SET	BYTE
SET	FCB	0
SETDISPLAYMODE	LDA	SET
	CMPA	#4
	BEQ	BUFFER1	;sg4
	CMPA	#8
	BEQ	BUFFER2	;sg8
	RTS	;display mode not supported
;sg4
BUFFER1	CLRA	;set value 2 so its at 1024 view
	LDX	#65478
	STA	0,X
	STA	3,X
	STA	4,X
	STA	6,X
	STA	8,X
	STA	10,X
	STA	12,X
;also setdisplaymode
	LDX	#65472
	STA	,X
	STA	2,X
	STA	4,X
;extra vgd
	CLRA
	LDX	#65314
	STA	,X	;cleared vdg
	LDX	#65436	;cc3 set
	LDA	#15	;testing
	STA	,X
	RTS
;
;semigraphics 8
;3584 start of view to 5632
;5632 draw setup
BUFFER2	CLRA	;11
	LDX	#65478
	STA	1,X
	STA	3,X
	STA	4,X
	STA	7,X
	STA	8,X
	STA	10,X
	STA	12,X
;set 65314
	LDX	#65314
	LDA	,X
	ANDA	#7
	STA	,X	;set bit 7
;also setdisplaymode	;sg8
	LDX	#65472
	STA	,X
	STA	3,X
	STA	4,X
	LDX	#65436	;cc3 set
	LDA	#8
	STA	,X
	RTS
ENDFUNCTION
;
; ***************************************************************************************************************
; *   sync(d,col)
; ***************************************************************************************************************
FUNCTION	SYNC	DISPLAY,COLOR
REM	; sync(display,color) display 4,8 only supported so far. color 0-8 to clear after copy. 9=copy no erase.
REM	; Does not push to stack
DEF	DISPLAY	BYTE
DEF	COLOR	BYTE
DISPLAY	FCB	0
COLOR	FCB	0
COLORD	FCB	0,0
DOTS	FCB	0
SYNC	LDA	DISPLAY
	CMPA	#4
	BEQ	BUFFER1
	CMPA	#8
	BEQ	BUFFER2
	RTS	;add more displays as i go
;mode sg4
BUFFER1	LDA	COLOR
	CMPA	#0
	BEQ	NOCOL1
	CMPA	#9
	BEQ	NOERR1	;no erase
	DECA	;there is color
	LSLA
	LSLA
	LSLA
	LSLA
	ADDA	#128
	ADDA	#15
	STA	COLOR
	BRA	SETMD1
NOCOL1	LDA	#128
	STA	COLOR
SETMD1	LDA	COLOR
	LDB	COLOR
	STD	COLORD
	LDX	#3584	;view area
	LDY	#1024	;copy from
	LDU	#COLORD
PLC1	LDD	,Y
	STD	,X++
	LDD	,U
	STD	,Y++
	CMPY	#1536
	BLO	PLC1
	RTS
NOERR1	LDX	#3584
	LDY	#1024
PLCC1	LDD	,Y++
	STD	,X++
	CMPY	#1536
	BLO	PLCC1
	RTS
;
;mode sg8
BUFFER2	LDA	COLOR
	CMPA	#0
	BEQ	NOCOL2
	CMPA	#9
	BEQ	NOERR2	;no erase
	DECA	;there is color
	BEQ	NOS2	;no need for shift
	LSLA
	LSLA
	LSLA
	LSLA
NOS2	ADDA	#128
	ADDA	#15
	STA	COLOR
	BRA	SETMD2
NOCOL2	LDA	#128	;no color
	STA	COLOR
SETMD2	LDA	COLOR
	LDB	COLOR
	STD	COLORD
	LDX	#3584
	LDY	#5632
;	LDU	#7680	;sprite layer
PLC2	LDD	,Y
; 
;	LDB	,U+
;	CMPB	#128	;sprite layer black?
;	BEQ	PLCDD2
;	TFR	B,A	;nope lets draw sprite instead
; 
PLCDD2	STD	,X++
	LDD	COLORD
	STD	,Y++
	CMPY	#7680	;?
	BLO	PLC2
	RTS
NOERR2	LDX	#3584	;no erase just copy and also copy sprite layer test
	LDY	#5632
	LDU	#7680	;sprite layer
PLCC2	LDA	,Y+
	LDB	,U+
	CMPB	#128	;is it black
	BEQ	PLCD2
	TFR	B,A	;draw sprite instead
PLCD2	STA	,X+
	CMPY	#7680
	BLO	PLCC2
	RTS
ENDFUNCTION
;
; ***************************************************************************************************************
; *   syncscroll(d,direction,speed)
; ***************************************************************************************************************
FUNCTION	SYNCSCROLL	DISPLAY,DIRECTION,SPEED
REM	; syncscroll(display,direction,speed) display 4,8 only supported so far. 
REM	; Does not push to stack
DEF	DISPLAY	BYTE
DEF	SPEED	WORD
DEF	DIRECTION	BYTE
DISPLAY	FCB	0
DIRECTION	FCB	0
SPEED	FCB	0,0
COLORD	FCB	0,0
DOTS	FCB	0
TIMER	FCB	0,0
SAVEU	FCB	0,0
SYNCSCROLL	LDA	DISPLAY
	CMPA	#4
	LBEQ	BUFFER1
	CMPA	#8
	LBEQ	BUFFER2
	RTS	;add more displays as i go
;mode sg4
BUFFER1	LDD	$112
	ADDD	SPEED
	STD	TIMER
	CMPD	#62000
	BLO	BUFF1
	CLRA
	CLRB
	STD	$112
	LDD	SPEED
	STD	TIMER
BUFF1	LDA	DIRECTION
	CMPA	#0
	LBEQ	UP1
	CMPA	#1
	LBEQ	DOWN1
	CMPA	#2
	LBEQ	RIGHT1
	CMPA	#3
	LBEQ	LEFT1
	RTS
;left1
LEFT1	LDU	#1535	;may be 36?
	STU	SAVEU
LPLCB1	LDX	#4096	;normal start
	LDY	#4095	;1 byte more
	CLRB
LPLCC1	LDA	,-Y
	STA	,-X
	INCB
	CMPB	#31
	BLO	LPLCC1
	LDA	,U
	STA	,-X
	LEAY	-1,Y
	LEAU	-32,U
	CLRB
	CMPY	#3584
	BHS	LPLCC1	;possible?
LWAIT1	LDD	$112
	CMPD	TIMER
	BLO	LWAIT1
	ADDD	SPEED
	STD	TIMER
	LDU	SAVEU
	LEAU	-1,U
	STU	SAVEU
	CMPU	#1504
	BHS	LPLCB1
	RTS
;right1
RIGHT1	LDU	#1024
	STU	SAVEU
RPLCB1	LDX	#3584	;normal start
	LDY	#3585	;1 byte more
	CLRB
RPLCC1	LDA	,Y+
	STA	,X+
	INCB
	CMPB	#31
	BLO	RPLCC1
	LDA	,U+
	STA	,X+
	LEAY	1,Y
	LEAU	31,U
	CLRB
	CMPY	#4095
	BLO	RPLCC1
RWAIT1	LDD	$112
	CMPD	TIMER
	BLO	RWAIT1
	ADDD	SPEED
	STD	TIMER
	LDU	SAVEU
	LEAU	1,U
	STU	SAVEU
	CMPU	#1056
	BLO	RPLCB1
	RTS
UP1	LDU	#1536
UPLCB1	LDX	#4096	;normal end
	LDY	#4064	;1 line short
UPLCC1	LDD	,--Y
	STD	,--X
	CMPY	#3584
	BHI	UPLCC1
UPLCA1	LDD	,--U
	STD	,--X
	CMPX	#3584
	BHI	UPLCA1
UWAIT1	LDD	$112
	CMPD	TIMER
	BLO	UWAIT1
	ADDD	SPEED
	STD	TIMER
	CMPU	#1024
	BHI	UPLCB1
	RTS
DOWN1	LDU	#1024
DPLCB1	LDX	#3584	;normal end
	LDY	#3616	;1 line short
DPLCC1	LDD	,Y++
	STD	,X++
	CMPY	#4096
	BLO	DPLCC1
DPLCA1	LDD	,U++	;may mirror?
	STD	,X++
	CMPX	#4096
	BLO	DPLCA1
DWAIT1	LDD	$112
	CMPD	TIMER
	BLO	DWAIT1
	ADDD	SPEED
	STD	TIMER
	CMPU	#1536
	BLO	DPLCB1
	RTS
;
;mode sg8
; BUFFER2	RTS	;nothing yet
;	LDX	#3584	;no erase just copy
;	LDY	#5632
; PLCC2	LDD	,Y++
;	STD	,X++
;	CMPY	#7680
;	BLO	PLCC2
;	RTS
;
; mode sg8
BUFFER2	LDD	$112
	ADDD	SPEED
	STD	TIMER
	CMPD	#62000
	BLO	BUFF2
	CLRA
	CLRB
	STD	$112
	LDD	SPEED
	STD	TIMER
BUFF2	LDA	DIRECTION
	CMPA	#0
	LBEQ	UP2
	CMPA	#1
	LBEQ	DOWN2
	CMPA	#2
	LBEQ	RIGHT2
	CMPA	#3
	LBEQ	LEFT2
	RTS
; left2
LEFT2	LDU	#7679
	STU	SAVEU
LPLCB2	LDX	#5632	;normal start
	LDY	#5631	;1 byte more
	CLRB
LPLCC2	LDA	,-Y
	STA	,-X
	INCB
	CMPB	#31
	BLO	LPLCC2
	LDA	,U
	STA	,-X
	LEAY	-1,Y
	LEAU	-32,U
	CLRB
	CMPY	#3584
	BHS	LPLCC2	;possible?
LWAIT2	LDD	$112
	CMPD	TIMER
	BLO	LWAIT2
	ADDD	SPEED
	STD	TIMER
	LDU	SAVEU
	LEAU	-1,U
	STU	SAVEU
	CMPU	#7648
	BHS	LPLCB2
	RTS
;
; right2
RIGHT2	LDU	#5632
	STU	SAVEU
RPLCB2	LDX	#3584	;normal start
	LDY	#3585	;1 byte more
	CLRB
RPLCC2	LDA	,Y+
	STA	,X+
	INCB
	CMPB	#31
	BLO	RPLCC2
	LDA	,U+
	STA	,X+
	LEAY	1,Y
	LEAU	31,U
	CLRB
	CMPY	#5632
	BLO	RPLCC2
RWAIT2	LDD	$112
	CMPD	TIMER
	BLO	RWAIT2
	ADDD	SPEED
	STD	TIMER
	LDU	SAVEU
	LEAU	1,U
	STU	SAVEU
	CMPU	#5664
	BLO	RPLCB2
	RTS
; up2
UP2	LDU	#7680
UPLCB2	LDX	#5632	;normal end
	LDY	#5568	;drop 2 lines short
UPLCC2	LDD	,--Y
	STD	,--X
	CMPY	#3584
	BHI	UPLCC2
UPLCA2	LDD	,--U
	STD	,--X
	CMPX	#3584
	BHI	UPLCA2
UWAIT2	LDD	$112
	CMPD	TIMER
	BLO	UWAIT2
	ADDD	SPEED
	STD	TIMER
	CMPU	#5632
	BHI	UPLCB2
	RTS
; dn
DOWN2	LDU	#5632
; DVWAIT2	ORCC	#$50
; DVWAIT22	LDA	$FF03
; 	BPL	DVWAIT22
; 	LDA	$FF02
; 	ANDCC	#$EF
DPLCB2	LDX	#3584	;normal end
	LDY	#3648	;1 line short
DPLCC2	LDD	,Y++
	STD	,X++
	CMPY	#5632
	BLO	DPLCC2
DPLCA2	LDD	,U++	;may mirror?
	STD	,X++
	CMPX	#5632
	BLO	DPLCA2
DWAIT2	LDD	$112
	CMPD	TIMER
	BLO	DWAIT2
	ADDD	SPEED
	STD	TIMER
	CMPU	#7680
	BLO	DPLCB2
	RTS
ENDFUNCTION
;
; ***************************************************************************************************************
; *   updatejoystick()
; ***************************************************************************************************************
FUNCTION	UPDATEJOYSTICK	
REM	; updatejoystick() this updates left joystick port and saves data at $015a $015b y,x bt1=$015c bt2=$015d
REM	; Does not push to stack
UPDATEJOYSTICK	LDA	$FF23
	ORA	#8	;=1
	EORA	#8	;=0      shutting sound bit off 
	STA	$FF23
	LDA	#$3D
	STA	$FF03
	LDA	#$3C
	STA	$FF01
	CLRB
JOYLEFT	STB	$FF20	;testing comparitor
	LDA	$FF00	;load actual voltage value
	BPL	JOYLF
	ADDB	#$04
	CMPB	#$FC
	BEQ	JOYLF
	BRA	JOYLEFT
JOYLF	LSRB
	LSRB
	STB	$015A
	LDA	#$34
	STA	$FF01
	CLRB
JOYRIGHT	STB	$FF20	;testing comparitor
	LDA	$FF00	;load actual voltage value
	BPL	JOYRF
	ADDB	#$04
	CMPB	#$FC
	BEQ	JOYRF
	BRA	JOYRIGHT
JOYRF	LSRB
	LSRB
	STB	$015B
; lets get joystick fire buttons and store at $015c, $015d
	LDD	$FFFE
	ADDD	$FFFF
	CMPA	#167
	BEQ	SETCC3
	CLRA
	BRA	JOYBT
SETCC3	LDA	#1	
JOYBT	CMPA	#1
	BEQ	JOYC3
	LDA	$FF00
	ANDA	#2
	STA	$015C
	LDA	$FF00
	ANDA	#1
	STA	$015D
	BRA	SETTV
JOYC3	LDA	$0152
	ANDA	#2
	STA	$015C
	LDA	$0152
	ANDA	#8
	STA	$015D
SETTV	LDA	$FF23	;turn sound back on for gmc or psg
	ORA	#8
	STA	$FF23
	LDA	$FF03
	ORA	#8
	STA	$FF03
	LDA	$FF01
	ORA	#8
	EORA	#8
	STA	$FF01
	RTS	;return
ENDFUNCTION
;
;
; ***************************************************************************************************************
; *   updatejoysticklr()	left and right only no sound problems
; ***************************************************************************************************************
FUNCTION	UPDATEJOYSTICKLR	
REM	; updatejoystick() this updates left joystick port and saves data at $015b x only  bt1=$015c bt2=$015d
REM	; Does not push to stack
UPDATEJOYSTICKLR	LDA	#$3D
	STA	$FF03
	LDA	#$34
	STA	$FF01
	CLRB
JYL1	STB	$FF20
	LDA	$FF00
	BPL	JYC1
	ADDB	#$04
	CMPB	#$FC
	BEQ	JYC1
	BRA	JYL1
JYC1	LSRB
	LSRB
	STB	$015B
	LDD	$FFFE
	ADDD	$FFFF
	CMPA	#167
	BEQ	SETCC3
	CLRA
	BRA	JOYBT
SETCC3	LDA	#1	
JOYBT	CMPA	#1
	BEQ	JOYC3
	LDA	$FF00
	ANDA	#2
	STA	$015C
	LDA	$FF00
	ANDA	#1
	STA	$015D
	BRA	SETTV
JOYC3	LDA	$0152
	ANDA	#2
	STA	$015C
	LDA	$0152
	ANDA	#8
	STA	$015D
SETTV	RTS	;dont need to play with tv
	LDA	$FF23	;turn sound back on for gmc or psg
	ORA	#8
	STA	$FF23
	LDA	$FF03
	ORA	#8
	STA	$FF03
	LDA	$FF01
	ORA	#8
	EORA	#8
	STA	$FF01
	RTS	;return
ENDFUNCTION
